package com.gupao.javavip.gof.singleton;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 注册式单例模式-容器
 * <p>
 * 优点：适用于创建实例非常多的情况，便于管理
 * 缺点：同懒汉模式一样，用到 synchronized 关键字来解决线程安全问题，对程序性能还是存在一定影响的。
 * <p>
 */
public class RegisterContainerSingleton {
    //static保证类初始化时便实例化
    private static Map<String, Object> INSTANCE_MAP = new ConcurrentHashMap<String, Object>();

    //构造方法私有化
    private RegisterContainerSingleton() {
    }

    //提供全局访问点
    public static Object getInstance(String className) {
        synchronized (INSTANCE_MAP) {
            if (!INSTANCE_MAP.containsKey(className)) {
                Object instance = null;
                try {
                    instance = Class.forName(className).newInstance();
                    INSTANCE_MAP.put(className, instance);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return instance;
            } else {
                return INSTANCE_MAP.get(className);
            }
        }
    }
}
